package com.gxy.learn.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class TestService {


    public String apiHello(String name) {
        return "Hello, " + name;
    }

    /**
     * 使用注解进行流控
     * <p>
     * 设置qps为2 超过1 超过1 则限流
     *
     * @param name
     * @return
     */
    @SentinelResource(value = "taskFlow")
    public String taskFlow(String name) {
        return "Hello, " + name;
    }

    /**
     * 使用注解进行流控
     * <p>
     * 设置qps为2 超过1 超过1 则进行异常处理 可以直接方法
     *
     * @param name
     * @return
     */
    @SentinelResource(value = "taskFlowException", blockHandler = "exceptionHandler")
    public String taskFlowException(String name) {
        return "Hello, " + name;
    }

    /**
     * 限流与阻塞处理
     *
     * @param str
     * @param ex
     */
    public void exceptionHandler(String str, BlockException ex) {
        log.error("blockHandler：" + str, ex);
    }


    /**
     * 使用注解进行降级
     * <p>
     * 设置qps为2 超过1 超过1 则进行异常处理 可以直接方法
     *
     * @param name
     * @return
     */
    @SentinelResource(value = "taskFlowDown", blockHandler = "fallbackHandler")
    public String taskFlowDown(String name) {
        return "Hello, " + name;
    }

    /**
     * 降级处理
     *
     * @param str
     */
    public void fallbackHandler(String str) {
        log.error("fallbackHandler：" + str);
    }
}
